View Javadoc

1   package net.sourceforge.simplegamenet.chess;
2   
3   import java.awt.*;
4   import java.awt.event.MouseEvent;
5   import javax.swing.*;
6   import javax.swing.event.MouseInputListener;
7   
8   public class ChessPlayFieldComponent extends JComponent
9           implements ChessPlayFieldState, ChessPieceType,
10          ChessPieceOwner, MouseInputListener {
11  
12      public static final int IMAGE_PART_WIDTH = 50;
13      public static final int IMAGE_PART_HEIGHT = 50;
14  
15      private ChessPanel chessPanel;
16  
17      private Image piecesImage;
18      private Image squaresImage;
19  
20      private ChessPlayerClient chessPlayerClient;
21  
22      private int[][] pieceTypeGrid = ChessPlayField.DEFAULT_PIECE_TYPE_GRID;
23      private int[][] pieceOwnerGrid = ChessPlayField.DEFAULT_PIECE_OWNER_GRID;
24  
25      private boolean[][] moveSourceAllowedGrid = null;
26      private boolean[][] moveDestinationAllowedGrid = null;
27  
28      private int selectedX = -1;
29      private int selectedY = -1;
30      private int reviewedX = -1;
31      private int reviewedY = -1;
32  
33      private int pieceOwnerSight = WHITE_OWNER;
34  
35      public ChessPlayFieldComponent(ChessPlayerClient chessPlayerClient, ChessPanel chessPanel,
36                                     Image piecesImage, Image squaresImage) {
37          super();
38          this.chessPlayerClient = chessPlayerClient;
39          this.chessPanel = chessPanel;
40          this.piecesImage = piecesImage;
41          this.squaresImage = squaresImage;
42          setMinimumSize(new Dimension(IMAGE_PART_WIDTH * ChessPlayField.GRID_WIDTH,
43                  IMAGE_PART_HEIGHT * ChessPlayField.GRID_HEIGHT));
44          setPreferredSize(new Dimension(IMAGE_PART_WIDTH * ChessPlayField.GRID_WIDTH,
45                  IMAGE_PART_HEIGHT * ChessPlayField.GRID_HEIGHT));
46          addMouseListener(this);
47          addMouseMotionListener(this);
48      }
49  
50      public void setPieceOwnerSight(int pieceOwnerSight) {
51          this.pieceOwnerSight = pieceOwnerSight;
52      }
53  
54      public void setEnabled(boolean enabled) {
55          super.setEnabled(enabled);
56          if (enabled) {
57              moveSourceAllowedGrid = chessPlayerClient.getMoveSourceAllowedGrid();
58          } else {
59              selectedX = -1;
60              selectedY = -1;
61              reviewedX = -1;
62              reviewedY = -1;
63              repaint();
64          }
65      }
66  
67      public void playFieldUpdated(int[][] pieceTypeGrid, int[][] pieceOwnerGrid) {
68          this.pieceTypeGrid = pieceTypeGrid;
69          this.pieceOwnerGrid = pieceOwnerGrid;
70          repaint();
71      }
72  
73      public void paintComponent(Graphics graphics) {
74          super.paintComponent(graphics);
75          int y = 0;
76          int x = 0;
77          for (int i = 0; i < ChessPlayField.GRID_WIDTH; i++) {
78              for (int j = 0; j < ChessPlayField.GRID_HEIGHT; j++) {
79                  switch (pieceOwnerSight) {
80                      case WHITE_OWNER:
81                      case NO_OWNER:
82                          x = i * IMAGE_PART_WIDTH;
83                          y = j * IMAGE_PART_HEIGHT;
84                          break;
85                      case BLACK_OWNER:
86                          x = (ChessPlayField.GRID_WIDTH - i - 1) * IMAGE_PART_WIDTH;
87                          y = (ChessPlayField.GRID_HEIGHT - j - 1) * IMAGE_PART_HEIGHT;
88                          break;
89                  }
90                  graphics.drawImage(squaresImage, x, y,
91                          x + IMAGE_PART_WIDTH, y + IMAGE_PART_HEIGHT,
92                          ((i + j) % 2) * IMAGE_PART_WIDTH, 0,
93                          ((i + j) % 2 + 1) * IMAGE_PART_WIDTH, IMAGE_PART_HEIGHT,
94                          this);
95                  if (pieceTypeGrid[i][j] == NO_TYPE) {
96                      if (selectedX >= 0 && selectedY >= 0 && reviewedX == i && reviewedY == j) {
97                          int pieceIndex = getPieceIndex(selectedX, selectedY);
98                          graphics.drawImage(piecesImage, x, y,
99                                  x + IMAGE_PART_WIDTH, y + IMAGE_PART_HEIGHT,
100                                 pieceIndex * IMAGE_PART_WIDTH, 3 * IMAGE_PART_HEIGHT,
101                                 (pieceIndex + 1) * IMAGE_PART_WIDTH, 4 * IMAGE_PART_HEIGHT,
102                                 this);
103                     }
104                 } else {
105                     int pieceIndex = getPieceIndex(i, j);
106                     int pieceState = 0;
107                     if (selectedX >= 0 && selectedY >= 0) {
108                         if (selectedX == i && selectedY == j) {
109                             pieceState = 2;
110                         } else {
111                             if (reviewedX == i && reviewedY == j) {
112                                 pieceState = 4;
113                             } else {
114                                 pieceState = 0;
115                             }
116                         }
117                     } else {
118                         if (reviewedX == i && reviewedY == j) {
119                             pieceState = 1;
120                         } else {
121                             pieceState = 0;
122                         }
123                     }
124                     graphics.drawImage(piecesImage, x, y,
125                             x + IMAGE_PART_WIDTH, y + IMAGE_PART_HEIGHT,
126                             pieceIndex * IMAGE_PART_WIDTH,
127                             pieceState * IMAGE_PART_HEIGHT,
128                             (pieceIndex + 1) * IMAGE_PART_WIDTH,
129                             (pieceState + 1) * IMAGE_PART_HEIGHT,
130                             this);
131                 }
132             }
133         }
134     }
135 
136     private int getPieceIndex(int i, int j) {
137         int pieceIndex = pieceOwnerGrid[i][j] == BLACK_OWNER ? 6 : 0;
138         switch (pieceTypeGrid[i][j]) {
139             case KING:
140                 return pieceIndex;
141             case QUEEN:
142                 return pieceIndex + 1;
143             case BISHOP:
144                 return pieceIndex + 2;
145             case KNIGHT:
146                 return pieceIndex + 3;
147             case ROOK:
148                 return pieceIndex + 4;
149             case PAWN:
150                 return pieceIndex + 5;
151         }
152         return pieceIndex + 5;
153     }
154 
155     /***
156      * Invoked when the mouse button has been clicked (pressed
157      * and released) on a component.
158      */
159     public void mouseClicked(MouseEvent mouseEvent) {
160     }
161 
162     /***
163      * Invoked when a mouse button is pressed on a component and then
164      * dragged.  <code>MOUSE_DRAGGED</code> events will continue to be
165      * delivered to the component where the drag originated until the
166      * mouse button is released (regardless of whether the mouse position
167      * is within the bounds of the component).
168      * <p/>
169      * Due to platform-dependent Drag&Drop implementations,
170      * <code>MOUSE_DRAGGED</code> events may not be delivered during a native
171      * Drag&Drop operation.
172      */
173     public void mouseDragged(MouseEvent mouseEvent) {
174     }
175 
176     /***
177      * Invoked when the mouse enters a component.
178      */
179     public void mouseEntered(MouseEvent mouseEvent) {
180     }
181 
182     /***
183      * Invoked when the mouse exits a component.
184      */
185     public void mouseExited(MouseEvent mouseEvent) {
186         reviewedX = -1;
187         reviewedY = -1;
188         repaint();
189     }
190 
191     /***
192      * Invoked when the mouse cursor has been moved onto a component
193      * but no buttons have been pushed.
194      */
195     public void mouseMoved(MouseEvent mouseEvent) {
196         if (isEnabled()) {
197             int x = mouseEvent.getX() / IMAGE_PART_WIDTH;
198             int y = mouseEvent.getY() / IMAGE_PART_HEIGHT;
199             if (pieceOwnerSight == BLACK_OWNER) {
200                 x = ChessPlayField.GRID_WIDTH - x - 1;
201                 y = ChessPlayField.GRID_HEIGHT - y - 1;
202             }
203             if (selectedX >= 0 && selectedY >= 0) {
204                 if (!moveDestinationAllowedGrid[x][y]) {
205                     x = -1;
206                     y = -1;
207                 }
208             } else {
209                 if (!moveSourceAllowedGrid[x][y]) {
210                     x = -1;
211                     y = -1;
212                 }
213             }
214             if (reviewedX != x || reviewedY != y) {
215                 reviewedX = x;
216                 reviewedY = y;
217                 repaint();
218             }
219         }
220     }
221 
222     /***
223      * Invoked when a mouse button has been pressed on a component.
224      */
225     public void mousePressed(MouseEvent mouseEvent) {
226         if (isEnabled()) {
227             int x = mouseEvent.getX() / IMAGE_PART_WIDTH;
228             int y = mouseEvent.getY() / IMAGE_PART_HEIGHT;
229             if (pieceOwnerSight == BLACK_OWNER) {
230                 x = ChessPlayField.GRID_WIDTH - x - 1;
231                 y = ChessPlayField.GRID_HEIGHT - y - 1;
232             }
233             if (selectedY >= 0 && selectedX >= 0) {
234                 if (moveDestinationAllowedGrid[x][y]) {
235                     chessPanel.makeMove(selectedX, selectedY, x, y);
236                 }
237                 selectedX = -1;
238                 selectedY = -1;
239                 reviewedX = -1;
240                 reviewedY = -1;
241                 repaint();
242             } else {
243                 if (moveSourceAllowedGrid[x][y]) {
244                     moveDestinationAllowedGrid =
245                             chessPlayerClient.getMoveDestinationAllowedGrid(x, y);
246                     selectedX = x;
247                     selectedY = y;
248                     reviewedX = -1;
249                     reviewedY = -1;
250                     repaint();
251                 }
252             }
253         }
254     }
255 
256     /***
257      * Invoked when a mouse button has been released on a component.
258      */
259     public void mouseReleased(MouseEvent mouseEvent) {
260     }
261 
262 }